
; ***Comienzo rutina writeNUM***
;
; Imprime por pantalla un numero (word con signo) sin <Enter> al final
; (usa rutina writeSTR)
;
; Parametro entrada 1: tipo de aritmetica -0000h=sin signo, 0001h=con signo- (word/via push del llamador)
; Parametro entrada 2: numero a imprimir (word/via push del llamador)
;
writeNUM proc near
    push bp
    mov bp, sp
    sub sp, 1        ; "variable local" [bp-1] = signo (00h=positivo, 01h=negativo)
    sub sp, 6        ; "variable local" [bp-7] = espacio para imprimir (db 6 dup(?))

    push ax
    push bx
    push cx
    push dx
    push si
    
    mov [bp-1], 00h
    mov ax, [bp+4]
    
    cmp [bp+6], 0
    je comenzar      ; Si no es aritmetica con signo, comienza
    cmp ax, 0
    jge comenzar     ; Si no es negativo, comienza

    neg ax           ; Realiza ax = -ax
    mov [bp-1], 01h
    
comenzar:
    mov bx, 10
    mov cx, 0
    mov si, bp
    sub si, 8

proxdiv:
    dec si
    xor dx, dx    
    div bx
    add dl, 48
    mov [si], dl
    inc cx
    cmp ax, 0
    jnz proxdiv
    
    cmp [bp-1], 00h
    jz mostrar
    
    dec si
    mov [si], '-'
    inc cx

mostrar:    
    push si
    push cx
    call writeSTR

    pop si
    pop dx
    pop cx
    pop bx
    pop ax

    mov sp, bp   
    pop bp
    ret 4
writeNUM endp
;
; ***Fin rutina writeNUM***

; ***Comienzo rutina writeSTR***
;
; Imprime por pantalla un string sin <Enter> al final
;
; Parametro entrada 1: direccion de memoria donde comienza el string a imprimir (word/via push del llamador)
; Parametro entrada 2: cantidad de caracteres del string (word/via push del llamador)
;
writeSTR proc near
    push bp
    mov bp, sp
    push ax
    push bx
    push cx
    push si

    mov si, [bp+6]  ; a SI se le asigna el primer parametro (direccion)
    mov cx, [bp+4]  ; a CX se le asigna el segundo parametro (cantidad de caracteres)
    xor bx, bx
    
loop:    
    mov al, [si]
    mov ah, 0Eh
    int 10h     
    inc bx
    inc si
    cmp bx, cx
    jne loop

    pop si
    pop cx
    pop bx
    pop ax
    pop bp
    ret 4
writeSTR endp
;
; ***Fin rutina writeSTR***


ret




